home *** CD-ROM | disk | FTP | other *** search
- unit TBOBSMTP;
- {$DEFINE DEBUG}
- interface
- uses
- Classes, ScktComp;
-
- type
- TBSMTP = class(TComponent)
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- public
- procedure SendMail;
- protected
- _Socket: TClientSocket;
- Step: Integer;
- procedure SocketRead(Sender: TObject; Socket: TCustomWinSocket);
- procedure SocketWrite(Sender: TObject; Socket: TCustomWinSocket);
- private
- fMailServer: String;
- fMessageTo: String; { only one "To" at a time }
- fMessageFrom: String;
- fMessageSubject: String;
- fMessageText: TStringList; { assign to TMemo.Lines for example }
- procedure SetMessageText(NewText: TStringList);
- published
- property MailServer: String read fMailServer write fMailServer;
- property MessageTo: String read fMessageTo write fMessageTo;
- property MessageFrom: String read fMessageFrom write fMessageFrom;
- property MessageSubject: String read fMessageSubject write fMessageSubject;
- property MessageText: TStringList read fMessageText write SetMessageText;
- end;
-
- implementation
- uses
- SysUtils, Forms; { for the Application.ProcessMessages-loop }
-
- constructor TBSMTP.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- _Socket := TClientSocket.Create(Self);
- _Socket.Port := 25; // according to RFC 821
- _Socket.OnRead := SocketRead;
- _Socket.OnWrite := SocketWrite;
- Step := 0;
- fMessageText := TStringList.Create
- end {Create};
-
- destructor TBSMTP.Destroy;
- begin
- fMessageText.Free;
- _Socket.Free;
- _Socket := nil;
- inherited Destroy
- end {Destroy};
-
- procedure TBSMTP.SetMessageText(NewText: TStringList);
- begin
- fMessageText.Assign(NewText)
- end {SetMessageText};
-
- procedure TBSMTP.SocketRead(Sender: TObject; Socket: TCustomWinSocket);
- var
- Status: String;
- begin
- Status := Socket.ReceiveText;
- {$IFDEF DEBUG}
- writeln(Status);
- {$ENDIF}
- SocketWrite(Sender, Socket)
- end {SocketRead};
-
- procedure TBSMTP.SocketWrite(Sender: TObject; Socket: TCustomWinSocket);
- const
- CRLF = #13#10;
- var
- i: Integer;
- Send: String;
- begin
- Inc(Step);
- case Step of
- 1: Send := 'HELO ' + fMessageFrom;
- 2: Send := 'MAIL FROM:' + fMessageFrom;
- 3: Send := 'RCPT TO:' + fMessageTo;
- 4: Send := 'RCPT TO:bob@bolesian.nl'; { always a copy to myself }
- 5: Send := 'DATA';
- 6: begin
- {$IFDEF DEBUG}
- writeln('From: ' + fMessageFrom);
- {$ENDIF}
- Socket.SendText('From: ' + fMessageFrom + CRLF);
- {$IFDEF DEBUG}
- writeln('To: ' + fMessageTo);
- {$ENDIF}
- Socket.SendText('To: ' + fMessageTo + CRLF);
- {$IFDEF DEBUG}
- writeln('Cc: bob@bolesian.nl');
- {$ENDIF}
- Socket.SendText('Cc: bob@bolesian.nl' + CRLF);
- {$IFDEF DEBUG}
- writeln('Subject: ' + fMessageSubject + CRLF);
- {$ENDIF}
- Socket.SendText('Subject: ' + fMessageSubject + CRLF + CRLF);
- for i:=0 to Pred(fMessageText.Count) do
- begin
- Send := fMessageText[i];
- {$IFDEF DEBUG}
- writeln(Send);
- {$ENDIF}
- Socket.SendText(Send + CRLF)
- end;
- Send := '.'
- end;
- 7: Send := 'QUIT'
- end;
- {$IFDEF DEBUG}
- writeln(Send);
- {$ENDIF}
- Socket.SendText(Send + CRLF)
- end {SocketWrite};
-
- procedure TBSMTP.SendMail;
- begin
- Step := 0;
- _Socket.Active := False;
- _Socket.Host := fMailServer;
- _Socket.Open;
- repeat
- { need to rewrite this using low-level Windows APIs }
- Application.ProcessMessages
- until Step > 7
- end {SendMail};
-
- end.
-